﻿using Intellego.Web.ValidationEngine;
using System;
using MIAP.Negocio;
using MIAPWEB.Common;
using MIAP.Entidades.Enums;
using System.Web.UI.WebControls;
using MIAP.Entidades;
using System.Collections.Generic;
using System.Linq;

namespace MIAPWEB.Forms
{
    public partial class AdministraPerfil : PageBase
    {
        #region Constantes
        #endregion

        #region Campos

        /// <summary>
        /// Almacena el id del estatus del perfil.
        /// </summary>
        private int idEstatus = 0;

        /// <summary>
        /// Almacena el nombre del perfil.
        /// </summary>
        private string nombrePerfil = string.Empty;

        /// <summary>
        /// Almacena el estatus del perfil;
        /// </summary>
        private bool? estatus;

        /// <summary>
        /// Almacena el estatus del perfil;
        /// </summary>
        private int? idProyecto;

        /// <summary>
        /// Clase de negocio de las operaciones de perfiles.
        /// </summary>
        private AdministrarPerfilesNegocio perfilNegocio;

        /// <summary>
        /// Clase de negocio de las operaciones de perfiles.
        /// </summary>
        private AdministrarProyectosNegocio proyectoNegocio;

        /// <summary>
        /// Clase de negocio para las operaciones comunes del sistema.
        /// </summary>
        private ComunesNegocio comunesNegocio;

        #endregion

        #region Propiedades

        /// <summary>
        /// Id del perfil 
        /// </summary>
        private int? IdPerfil
        {
            get
            {
                if (this.ViewState[AppQueryStrings.IdPerfil] == null)
                {
                    this.ViewState[AppQueryStrings.IdPerfil] = "0";
                }

                return Convert.ToInt32(this.ViewState[AppQueryStrings.IdPerfil]);
            }

            set
            {
                this.ViewState[AppQueryStrings.IdPerfil] = value;
            }
        }

        /// <summary>
        /// Lista de perfiles
        /// </summary>
        private List<PerfilInfo> ListaPerfiles
        {
            get
            {
                if (this.ViewState["ListaPerfiles"] == null)
                {
                    this.ViewState["ListaPerfiles"] = new List<PerfilInfo>();
                }
                return this.ViewState["ListaPerfiles"] as List<PerfilInfo>;
            }

            set
            {
                this.ViewState["ListaPerfiles"] = value;
            }
        }

        /// <summary>
        /// Lista de permiso
        /// </summary>
        private IList<PermisoInfo> ListaPermisos
        {
            get
            {
                if (this.ViewState["ListaPermisos"] == null)
                {
                    this.ViewState["ListaPermisos"] = new List<PermisoInfo>();
                }
                return this.ViewState["ListaPermisos"] as List<PermisoInfo>;
            }

            set
            {
                this.ViewState["ListaPermisos"] = value;
            }
        }


        #endregion

        #region Constructor

        /// <summary>
        /// Inicializa las instancias de negocios
        /// </summary>
        public AdministraPerfil()
        {
            this.perfilNegocio = new AdministrarPerfilesNegocio();
            this.proyectoNegocio = new AdministrarProyectosNegocio();
            this.comunesNegocio = new ComunesNegocio();
        }

        #endregion

        #region Eventos

        /// <summary>
        /// Evento que se ejecuta al cargar la pagina.
        /// </summary>
        /// <param name="sender">Objeto que invoca al evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                var pageSize = Convert.ToInt32(new ConfiguracionNegocio().GetNumeroPaginasGrid().Descripcion);
                this.grdPerfiles.PageSize = pageSize;
                this.grdFunciones.PageSize = pageSize;
                this.GetEstatusPerfil();
                this.GetProyectos();
                this.Search();

                var permiso = AppSessionManager.Instance.Permisos.Where(p => p.Url == AppUrls.AltaPerfiles).SingleOrDefault();

                if (permiso == null)
                {
                    this.btnNuevo.Enabled = false;
                }
            }           
        }

        /// <summary>
        /// Busca todos los perfiles dependiendo de los filtros.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            this.Search();
        }

        /// <summary>
        /// realiza la busqueda con los campos especificados en los controles
        /// </summary>
        private void Search()
        {
            this.CleanSeleccion();
            this.GetFilters();
            this.GetPerfilesByFilters();
        }

        /// <summary>
        /// Redirecciona a la vista de AltaPerfil.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            this.Response.Redirect(AppUrls.AltaPerfiles);
            this.CleanSeleccion();
        }

        /// <summary>
        /// Redirecciona a la vista AltaPerfil.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void btnModificar_Click(object sender, EventArgs e)
        {
            if (!this.IdPerfil.HasValue || this.IdPerfil == 0)
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionar").ToString());
                return;
            }
            this.Response.Redirect(string.Format("{0}?{1}={2}", AppUrls.AltaPerfiles, AppQueryStrings.IdPerfil, this.IdPerfil));
            this.CleanSeleccion();
        }

        protected void btnEliminar_Click(object sender, EventArgs e)
        {
            if (!this.IdPerfil.HasValue || this.IdPerfil == 0)
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionar").ToString());
                return;
            }
            this.perfilNegocio.ChangeEstatusPerfil(this.IdPerfil.Value, false);
            AppSessionManager.Instance.RecalculaPermisos();
            this.CleanSeleccion();
            this.Search();
        }

        protected void grdPerfiles_SelectedIndexChanged(object sender, EventArgs eventArgs)
        {
            var dataKey = grdPerfiles.DataKeys[((GridView)sender).SelectedIndex];
            if (dataKey == null) return;
            var colsNoVisible = dataKey.Values;
            this.IdPerfil = Convert.ToInt32(colsNoVisible[0]);
            if (this.IdPerfil > 0)
            {
                GetPermisosPorPerfil(this.IdPerfil.Value);
            }
        }

        protected void grdFunciones_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grdFunciones.PageIndex = e.NewPageIndex;
            grdFunciones.DataSource = this.ListaPermisos;
            grdFunciones.DataBind();
        }

        protected void grdPerfiles_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grdPerfiles.PageIndex = e.NewPageIndex;
            grdPerfiles.DataSource = this.ListaPerfiles;
            grdPerfiles.DataBind();
        }

        protected void btnSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect(Common.AppUrls.Default);
        }
        #endregion

        #region Métodos

        /// <summary>
        /// Obtiene los estatus del perfil.
        /// </summary>
        public void GetEstatusPerfil()
        {
            this.ddlEstatus.DataSource = this.comunesNegocio.GetEstatus();
            this.ddlEstatus.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlEstatus);            
        }

        /// <summary>
        /// Obtiene los proyectos.
        /// </summary>
        public void GetProyectos()
        {
            this.ddlProyecto.DataSource = AppSessionManager.Instance.GetProyectosByPagina(AppUrls.AdministrarArchivos);
            this.ddlProyecto.DataBind();
            this.comunesNegocio.SetTodos(this.GetGlobalResourceObject("strings", "Todos").ToString(), this.ddlProyecto);    
        }

        /// <summary>
        /// Obtiene todos los archivos de un determinado perfil.
        /// </summary>
        public void GetPermisosPorPerfil(int idPerfil)
        {
            this.ListaPermisos = idPerfil > 0 ? this.perfilNegocio.GetPermisosPorPerfil(idPerfil) : new List<PermisoInfo>();
            this.grdFunciones.DataSource = this.ListaPermisos;
            this.grdFunciones.DataBind();
        }

        /// <summary>
        /// Obtiene todos los perfiles.
        /// </summary>
        public void GetPerfiles()
        {
            this.grdPerfiles.DataSource = this.perfilNegocio.GetPerfiles();
            this.grdPerfiles.DataBind();
        }

        /// <summary>
        /// Obtiene los perfiles de acuerdo a los filtros.
        /// </summary>
        public void GetPerfilesByFilters()
        {
            this.ListaPerfiles = this.perfilNegocio.GetPerfil(idProyecto, nombrePerfil, estatus);
            this.grdPerfiles.DataSource = this.ListaPerfiles;
            this.grdPerfiles.DataBind();
        }

        /// <summary>
        /// Obtiene los filtros.
        /// </summary>
        public void GetFilters()
        {
            this.idProyecto = this.ddlProyecto.SelectedValue == this.comunesNegocio.ValorTodos ? (int?)null : int.Parse(this.ddlProyecto.SelectedValue);

            this.idEstatus = int.Parse(this.ddlEstatus.SelectedValue);

            this.estatus = (this.ddlEstatus.SelectedValue == this.comunesNegocio.ValorTodos)
                               ? (bool?) null
                               : (idEstatus == (int) Estatus.Activo);                

            this.nombrePerfil = txtNombre.Text.Trim();
        }

        private void CleanSeleccion()
        {
            grdPerfiles.SelectedIndex = -1;
            this.IdPerfil = null;
            GetPermisosPorPerfil(0);
            this.ListaPerfiles = new List<PerfilInfo>();
        }

        #endregion

    }
}